package com.fulihui.information.core.db;

import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
 * @author Willard.Hu on 2016/12/28 0028.
 */
@Component
public interface ContentCounterDB {

    enum CounterType {READ_TIMES, UPVOTE, DOWNVOTE, SHARED_TIMES, COMMENT_TIMES, STAR_TIMES}

    /**
     * 自增内容统计属性的数量，执行一次+1操作
     * @param key {@link CounterType}
     * @param contentId 内容唯一标识
     * @return 自增后的数量
     */
    long incr(ContentCounterDB.CounterType key, String contentId);

    /**
     * 自增内容统计属性的数量，执行一次置顶数值的增加，数值负数时为减少
     * @param key {@link CounterType}
     * @param contentId 内容唯一标识
     * @param num 增加的数值，负数时为减少
     * @return 增量后的数值
     */
    long incrBy(ContentCounterDB.CounterType key, String contentId, int num);

    /**
     * 获取内容统计属性数量
     * @param key {@link CounterType}
     * @param contentId 内容唯一标识
     * @return 数量
     */
    long singleTimes(ContentCounterDB.CounterType key, String contentId);

    /**
     * 批量获取内容统计属性数量
     * @param key {@link CounterType}
     * @param contentIds 内容唯一标识列表
     * @return 数量列表，顺序与入参顺序一致
     */
    List<Long> multiTimes(ContentCounterDB.CounterType key, List<String> contentIds);

    /**
     * 批量删除内容统计属性
     * @param key {@link CounterType}
     * @param contentId 内容唯一标识列表
     * @return 执行结果 true / false
     */
    boolean multiDelete(ContentCounterDB.CounterType key, String... contentId);

    /**
     * 获取某个统计类型下的所有资讯统计数
     * @param key {@link CounterType}
     * @return Map集合
     */
    Map<String, String> getAll(ContentCounterDB.CounterType key);

}
